package com.junxian.springboot03.juc.threadPool.single;

import org.springframework.context.annotation.Lazy;

/**
 * 懒汉式单例：需要用到的时候才去创建实例
 * 使用synchronize来加锁解决多线程下创建多个实例的问题
 * 还有一个问题：在多线程的情况下，该代码可能会出现空指针问题，出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作
 * 解决：加关键字volatile可以防止指令重排
 *
 */
public class LazyMan {

    //要解决双重检查锁模式带来空指针异常的问题 加关键字volatile
    private static volatile LazyMan lazyMan;

    private LazyMan(){

    }


    public static LazyMan getLazyMan(){
        // 第一次判断，如果这里为空，不进入抢锁阶段，直接返回实例
        if (lazyMan == null){//双重检查锁模式
            synchronized (Lazy.class){
                if (lazyMan == null){
                    lazyMan = new LazyMan();
                }
            }
        }
        return lazyMan;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName() + "--" + getLazyMan());
            }).start();
        }
    }

}
